home *** CD-ROM | disk | FTP | other *** search
/ MacWorld 1999 June / Macworld (1999-06).dmg / Shareware World / Info / For Developers / MacZoop2.0.sea / MacZoop2.0 / Required Classes / ZCommander.cpp < prev    next >
Text File  |  1999-02-12  |  8KB  |  357 lines

  1. /*************************************************************************************************
  2. *
  3. *
  4. *            MacZoop - "the framework for the rest of us"         
  5. *
  6. *
  7. *
  8. *            ZCommander.cpp            -- an object for handling commands
  9. *
  10. *
  11. *
  12. *
  13. *
  14. *            © 1996, Graham Cox
  15. *
  16. *
  17. *
  18. *
  19. *************************************************************************************************/
  20.  
  21. #include    "ZCommander.h"
  22. #include    "MacZoop.h"
  23. #include    "ProjectSettings.h"
  24.  
  25. #if _ZCOMMANDER_DIALOG_AWARE
  26. #include    "ZDialog.h"
  27. #endif
  28.  
  29. CLASSCONSTRUCTOR( ZCommander );
  30.  
  31. /*----------------------------------***  CONSTRUCTOR  ***----------------------------------*/
  32.  
  33. ZCommander::ZCommander( ZCommander* aBoss )
  34.     : ZComrade()
  35. {
  36.     classID = CLASS_ZCommander;
  37.     
  38.     itsBoss = aBoss;
  39.     itsUnderlings = NULL;
  40.     
  41.     if ( itsBoss )
  42.         itsBoss->AddUnderling( this );
  43. }
  44.  
  45.  
  46. ZCommander::ZCommander()
  47.     : ZComrade()
  48. {
  49.     classID = CLASS_ZCommander;
  50.  
  51.     itsBoss = NULL;
  52.     itsUnderlings = NULL;
  53. }
  54.  
  55. /*-----------------------------------***  DESTRUCTOR  ***----------------------------------*/
  56.  
  57. ZCommander::~ZCommander()
  58. {
  59.     // kill any timers associated with this commander
  60.     
  61.     KillAllTimers( this );
  62.     
  63.     // dispose of any objects whose boss this is 
  64.     
  65.     if ( itsUnderlings )
  66.         itsUnderlings->DisposeAll();
  67.     
  68.     // remove us from our boss
  69.  
  70.     if ( itsBoss )
  71.         itsBoss->RemoveUnderling( this );
  72. }
  73.  
  74.  
  75. /*-------------------------------***  HANDLECOMMAND  ***---------------------------------*/
  76. /*    
  77.  
  78. if it has a boss, it passes the command to it for handling
  79. ----------------------------------------------------------------------------------------*/
  80.  
  81. void    ZCommander::HandleCommand( const short menuID, const short itemID )
  82. {
  83.     if ( itsBoss )
  84.         itsBoss->HandleCommand( menuID, itemID );
  85. }
  86.  
  87.  
  88. /*-------------------------------***  HANDLECOMMAND  ***--------------------------------*/
  89. /*    
  90. pass command object to boss if there is one
  91. ----------------------------------------------------------------------------------------*/
  92.  
  93. void    ZCommander::HandleCommand( const long theCommand )
  94. {
  95.     // pass edit menu commands to the local handler methods. It is easier to override
  96.     // those methods than to override this method, but the choice is yours.
  97.     
  98.     switch ( theCommand )
  99.     {
  100.         case kCmdCut:
  101.             DoCut();
  102.             break;
  103.         
  104.         case kCmdCopy:
  105.             DoCopy();
  106.             break;
  107.         
  108.         case kCmdPaste:
  109.             DoPaste();
  110.             break;
  111.         
  112.         case kCmdClear:
  113.             DoClear();
  114.             break;
  115.         
  116.         case kCmdSelectAll:
  117.             DoSelectAll();
  118.             break;
  119.         
  120.         default:
  121.             if ( itsBoss )
  122.                 itsBoss->HandleCommand( theCommand );
  123.             break;
  124.     }
  125. }
  126.  
  127.  
  128. /*-------------------------------***  UPDATEMENUS  ***---------------------------------*/
  129. /*    
  130.  
  131. if it has a boss, it asks it to update its menus
  132.  
  133. ----------------------------------------------------------------------------------------*/
  134.  
  135. void    ZCommander::UpdateMenus()
  136. {
  137.     // enable the paste command if there is something this object can
  138.     // paste.
  139.     
  140.     if ( CanPasteType())
  141.         gMenuBar->EnableCommand( kCmdPaste );
  142.     
  143.     if ( itsBoss )
  144.         itsBoss->UpdateMenus();
  145. }
  146.  
  147.  
  148.  
  149. /*-----------------------------***  HANDLEAPPLEEVENT  ***-------------------------------*/
  150. /*    
  151.  
  152. if it has a boss, it passes the command to it for handling. Override this to process
  153. apple events you are interested in, call the inherited method for others.
  154. ----------------------------------------------------------------------------------------*/
  155.  
  156. void    ZCommander::HandleAppleEvent(    AEEventClass aeClass, AEEventID aeID,
  157.                                         AppleEvent* aeEvt, AppleEvent* reply )
  158. {    
  159.     if ( itsBoss )
  160.         itsBoss->HandleAppleEvent( aeClass, aeID, aeEvt, reply );
  161. }
  162.  
  163.  
  164. /*-----------------------------------***  IDLE  ***-------------------------------------*/
  165. /*    
  166.  
  167. called periodically if this is in the chain of command. It passes the call up to its boss.
  168.  
  169. ----------------------------------------------------------------------------------------*/
  170.  
  171. void    ZCommander::Idle()
  172. {
  173.     if ( itsBoss )
  174.         itsBoss->Idle();
  175. }
  176.  
  177.  
  178. /*-----------------------------------***  TYPE  ***-------------------------------------*/
  179. /*    
  180.  
  181. this user is typing while this commander is active
  182.  
  183. ----------------------------------------------------------------------------------------*/
  184.  
  185. void    ZCommander::Type( const char theKey, const short modifiers )
  186. {
  187.     if ( theKey == BACKSPACE_KEY )
  188.         DoClear();
  189.     else
  190.     {
  191.         if ( itsBoss )
  192.             itsBoss->Type( theKey, modifiers );
  193.     }
  194. }
  195.  
  196.  
  197. /*--------------------------------***  DOSUSPEND  ***-----------------------------------*/
  198. /*    
  199.  
  200. the app is suspending
  201.  
  202. ----------------------------------------------------------------------------------------*/
  203.  
  204. void    ZCommander::DoSuspend()
  205. {
  206.     if ( itsBoss )
  207.         itsBoss->DoSuspend();
  208. }
  209.  
  210.  
  211. /*---------------------------------***  DORESUME  ***-----------------------------------*/
  212. /*    
  213.  
  214. the app is resuming
  215.  
  216. ----------------------------------------------------------------------------------------*/
  217.  
  218. void    ZCommander::DoResume()
  219. {
  220.     if ( itsBoss )
  221.         itsBoss->DoResume();
  222. }
  223.  
  224.  
  225.  
  226. /*-------------------------------***  ADDUNDERLING  ***---------------------------------*/
  227. /*    
  228. adds <anUnderling> to its list of underlings
  229. ----------------------------------------------------------------------------------------*/
  230.  
  231. void    ZCommander::AddUnderling( ZCommander* anUnderling )
  232. {
  233.     if ( itsUnderlings == NULL )
  234.         FailNIL( itsUnderlings = new ZCommanderList());
  235.     
  236.     itsUnderlings->AppendItem( anUnderling );
  237. }
  238.  
  239. /*-----------------------------***  REMOVEUNDERLING  ***--------------------------------*/
  240. /*    
  241. removes <anUnderling> from its list of underlings
  242. ----------------------------------------------------------------------------------------*/
  243.  
  244. void    ZCommander::RemoveUnderling( ZCommander* anUnderling )
  245. {
  246.     if ( itsUnderlings && itsUnderlings->Contains( anUnderling ))
  247.     {
  248.         itsUnderlings->DeleteObject( anUnderling );
  249.         
  250.         if ( itsUnderlings->CountItems() < 1 )
  251.             ForgetObject( itsUnderlings );
  252.     }    
  253. }
  254.  
  255. /*--------------------------------***  SENDMESSAGE  ***---------------------------------*/
  256. /*    
  257. send the message to the boss as well as any nominated listeners
  258. ----------------------------------------------------------------------------------------*/
  259.  
  260. void    ZCommander::SendMessage( long aMessage, void* msgData )
  261. {
  262.     // we always send this message to our boss
  263.     
  264.     if ( itsBoss )
  265.         itsBoss->ReceiveMessage( this, aMessage, msgData );
  266.         
  267.     ZComrade::SendMessage( aMessage, msgData );
  268. }
  269.  
  270.  
  271. /*--------------------------------***  SENDMESSAGE  ***---------------------------------*/
  272. /*    
  273. send the message to the boss as well as any nominated listeners
  274. ----------------------------------------------------------------------------------------*/
  275.  
  276. void    ZCommander::SendMessage( ZMessage* aMessage )
  277. {
  278.     // we always send this message to our boss
  279.  
  280.     if ( itsBoss )
  281.         itsBoss->ReceiveMessage( this, aMessage );
  282.         
  283.     ZComrade::SendMessage( aMessage );
  284. }
  285.  
  286.  
  287. /*-------------------------------***  WRITETOSTREAM  ***--------------------------------*/
  288. /*    
  289. make a note of who our boss and underlings are
  290. ----------------------------------------------------------------------------------------*/
  291.  
  292. void    ZCommander::WriteToStream( ZStream* aStream )
  293. {
  294. #if _MACZOOP_STREAMS
  295.     ZComrade::WriteToStream( aStream );
  296.     
  297.     // write boss of this commander- it's OK if it's NULL.
  298.     
  299.     aStream->WriteObject( itsBoss );
  300.  
  301.     // we do not explicitly write the underlings to the stream, since that is set
  302.     // up anyway when a command chain is relinked from a stream.
  303. #endif
  304. }
  305.  
  306. /*-------------------------------***  READFROMSTREAM  ***-------------------------------*/
  307. /*    
  308. read in our boss and underlings from the stream
  309. ----------------------------------------------------------------------------------------*/
  310.  
  311. void    ZCommander::ReadFromStream( ZStream* aStream )
  312. {
  313. #if _MACZOOP_STREAMS
  314.     ZComrade::ReadFromStream( aStream );
  315.     
  316.     itsBoss = (ZCommander*) aStream->ReadObject();
  317.     
  318.     // add this commander to its bosses underlings list:
  319.     
  320.     if ( itsBoss )
  321.         itsBoss->AddUnderling( this );
  322. #endif
  323. }
  324.  
  325.  
  326.  
  327. /*-------------------------------***  OPENSUBDIALOG  ***--------------------------------*/
  328. /*    
  329. open a dialog with the given ID as an underling of this commander (convenience method)
  330. ----------------------------------------------------------------------------------------*/
  331.  
  332. ZDialog*    ZCommander::OpenSubDialog( const short dlogID )
  333. {
  334. #if _ZCOMMANDER_DIALOG_AWARE
  335.     ZDialog*    zd;
  336.     
  337.     SetBeachBallCursor();
  338.     
  339.     FailNIL( zd = new ZDialog( this, dlogID ));
  340.  
  341.     try
  342.     {
  343.         zd->InitZWindow();
  344.         zd->Select();
  345.     }
  346.     catch( OSErr err )
  347.     {
  348.         ForgetObject( zd );
  349.         
  350.         throw err;
  351.     }
  352.     
  353.     return zd;
  354. #else
  355.     return NULL;
  356. #endif
  357. }